#include<iostream>
#include<pthread.h>
#include<cerrno>
#include<cstring>
#include<unistd.h>  
#include<sys/types.h>
#define NUM 10
__thread int gvalue = 0;//线程局部变量
void* test(void* arg)
{
    while(true){
        printf("new thread gvalue = %d ; new thread address = %p\n",gvalue,&gvalue);
        sleep(1);
    }
    return nullptr;
}
int main()
{
    pthread_t tid;
    int n = pthread_create(&tid,nullptr,test,nullptr);
    if(n !=0 ){
        std::cout<<"create thread failed "<<strerror(n)<<std::endl;
        return 1;
    }
    while(true){
        gvalue++;
        printf("main thread gvalue = %d ; main thread address = %p\n",gvalue,&gvalue);
        sleep(2);
    }
    return 0;
}
// class ThreadData{
// public:
//     ThreadData(const char* name,int a,int b)
//         :_name(name),_a(a),_b(b)
//     {}
//     std::string getName() const
//     {
//         return _name;
//     }
//     int Excute()
//     {
//         return _a + _b;
//     }
//     void Set_tid(pthread_t tid)
//     {
//         _tid = tid;
//     }
//     pthread_t Get_tid() const
//     {
//         return _tid;
//     }
// private:
//     std::string _name;
//     int _a;
//     int _b;
//     pthread_t _tid;
// };

// void* Work(void* arg)
// {
//     ThreadData* data = static_cast<ThreadData*>(arg);
//     while(true){
//         std::cout<<"new thread name: "<<data->getName()<<std::endl;
//         std::cout<<data->Get_tid()<<std::endl;
//         std::cout<<data->Excute()<<std::endl;
//         sleep(1);
//     }
//     return (void*)10;
// }
// int main()
// {
//     ThreadData* arr[NUM];
//     for(int i=0;i<NUM;i++){
//         char name[64];
//         snprintf(name,sizeof(name),"thread-%d",i);
//         arr[i] = new ThreadData(name,i*5,i*10);
//     }
//     for(int i = 0;i<NUM;i++){
//         pthread_t tid;
//         arr[i]->Set_tid(tid);
//         int n = pthread_create(&tid,nullptr,Work,arr[i]);
//         if(n !=0 ){
//             std::cout<<"create thread failed "<<strerror(n)<<std::endl;
//             return 1;
//         }
//         //void* ret = nullptr;
//         // int status = pthread_join(tid,&ret);//阻塞等待线程结束
//         // if(status!=0){
//         //     std::cerr<<"join error"<<strerror(status)<<std::endl;
//         //     return 1;
//         // }
//         // std::cout<<"join success ret = "<<(long long)ret<<std::endl;
//     }
//     while(true){
//         std::cout<<"main thread"<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }
// void* thread(void* arg)
// {
//     ThreadData* data = static_cast<ThreadData*>(arg);
//     while(true){
//         std::cout<<"new thread name: "<<data->getName()<<std::endl;
//         std::cout<<data->Excute()<<std::endl;
//         sleep(1);
//         break;
//     }
//     return (void*)10;
// }
// int main()
// {
//     pthread_t tid;
//     ThreadData* data = new ThreadData("thread-1",10,20);
//     int n = pthread_create(&tid,nullptr,thread,data);
//     if(n !=0 ){
//         std::cout<<"create thread failed "<<strerror(n)<<std::endl;
//         return 1;
//     }
//     void* ret = nullptr;
//     int status = pthread_join(tid,&ret);//阻塞等待线程结束
//     if(status!=0){
//         std::cerr<<"join error"<<strerror(status)<<std::endl;
//         return 1;
//     }
//     std::cout<<"join success ret = "<<(long long)ret<<std::endl;
//     return 0;
// }
// void* thread(void* arg)
// {
//     std::string name = static_cast<const char*>(arg);
//     while(true){
//         std::cout<<"new thread pid: "<<::getpid()<<std::endl;
//         //std::cout<<"new thread arg: "<<(char*)arg<<std::endl;
//         std::cout<<"new thread name: "<<name<<std::endl;
//         sleep(1);
//     }
//     return nullptr;//线程退出用return ;进程退出用exit
// }
// int main()
// {
//     pthread_t tid;
//     int n  = ::pthread_create(&tid,nullptr,thread,(void*)"thread-1");//创建线程
//     std::cout<<"new thread id: "<<tid<<std::endl;
//     if(n !=0 ){
//         std::cout<<"create thread failed "<<strerror(n)<<std::endl;
//         return 1;
//     }
//     while(true){//主线程
//         std::cout<<"main thread pid: "<<::getpid()<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }